package com.rent.house.service;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rent.house.pojo.dto.PendingHouseDto;
import com.rent.house.pojo.entity.HouseResource;
import com.rent.house.pojo.vo.HouseResourceVo;

import java.math.BigDecimal;
import java.util.List;

/**
 * 房源服务接口
 *
 * TODO: 定义房源相关的业务方法
 * - 发布房源
 * - 查询房源列表（分页）
 * - 查询房源详情（Redis缓存）
 * - 搜索房源（关键词缓存）
 * - 更新房源
 * - 删除房源
 * - 审核房源
 */
public interface HouseResourceService {

    /**
     * 发布房源
     * @param houseResource 房源信息
     * @param picList 图片列表
     * @return 房源ID
     */
    Long publishHouse(HouseResource houseResource, List<String> picList);

    /**
     * 根据ID获取房源详情
     * @param id 房源ID
     * @return 房源信息
     */
    HouseResource getHouseDetail(Long id);

    /**
     * 根据ID获取房源详情（包含图片信息）
     * @param id 房源ID
     * @return 房源信息VO（包含图片信息）
     */
    HouseResourceVo getHouseDetailWithPics(Long id);

    /**
     * 房源列表查询
     * @param pageNo 页码
     * @param pageSize 每页数量
     * @param city 城市
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param roomType 户型
     * @param keyword 关键词
     * @return 分页结果
     */
    Page<HouseResource> listHouses(Integer pageNo, Integer pageSize, String city, BigDecimal minPrice, BigDecimal maxPrice, String roomType, String keyword);

    /**
     * 房源列表查询（包含图片信息）
     * @param pageNo 页码
     * @param pageSize 每页数量
     * @param city 城市
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param roomType 户型
     * @param keyword 关键词
     * @return 分页结果（包含图片信息）
     */
    Page<HouseResourceVo> listHousesWithPics(Integer pageNo, Integer pageSize, String city, BigDecimal minPrice, BigDecimal maxPrice, String roomType, String keyword);

    /**
     * 搜索房源
     * @param keyword 关键词
     * @param pageNo 页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    Page<HouseResource> searchHouses(String keyword, Integer pageNo, Integer pageSize);

    /**
     * 搜索房源（包含图片信息）
     * @param keyword 关键词
     * @param pageNo 页码
     * @param pageSize 每页数量
     * @return 分页结果（包含图片信息）
     */
    Page<HouseResourceVo> searchHousesWithPics(String keyword, Integer pageNo, Integer pageSize);

    /**
     * 更新房源
     * @param houseResource 房源信息
     * @return 是否更新成功
     */
    boolean updateHouse(HouseResource houseResource);

    /**
     * 删除房源
     * @param id 房源ID
     * @return 是否删除成功
     */
    boolean deleteHouse(Long id);

    /**
     * 审核房源
     * @param id 房源ID
     * @param auditStatus 审核状态 0-待审核 1-审核通过 2-审核不通过
     * @param auditRemark 审核备注
     * @return 是否审核成功
     */
    boolean auditHouse(Long id, Integer auditStatus, String auditRemark);

    /**
     * 将HouseResource转换为HouseResourceVo
     * @param houseResource 房源实体
     * @return 房源VO对象
     */
    HouseResourceVo convertToVo(HouseResource houseResource);

    /**
     * 获取待审核的房源列表
     * @param pendingHouseDto 待审核的房源参数
     * @return 待审核的房源列表
     */
    Page<HouseResourceVo> getPendingHouses(PendingHouseDto pendingHouseDto);
}
